
這次的內容為製作一個打地鼠遊戲
作品實做
     const scoreBoard = document.querySelector(".score");
      const moles = [...document.querySelectorAll(".mole")]; //nodeList轉換成陣列
      
      const status = moles.reduce((prev, cur, index) => {
        prev[index] = false;
        return prev;
      }, {}); //設定每個地鼠的狀態預設為false
      let timeUp = true; //設定遊戲時間到的初始設定為true
      let score = 0; //設定初始分數
    const startScore = (s) => {
        score = s;
        scoreBoard.textContent = score; //設定分數欄分數
      };
      
    const startGame = () => {
        console.log("遊戲開始!");
        startScore(0);//設定初始分數為0
        randomMoles();//執行地鼠隨機跳出
        timeUp = false;
        setTimeout(() => {
          (timeUp = true), alert("時間到!");
        }, 10000); //遊戲時間十秒
      };
 const clickHandler = function () {
        if (molesProxy[moles.indexOf(this)]) {
          startScore(score + 1);
          console.log(`你點擊的分數:${score}`);
          molesProxy[moles.indexOf(this)] = false; //點擊後關閉
        }
      };
      //資料控制地鼠點擊分數
      const molesProxy = new Proxy(status, {
        get(target, key) {
          return target[key]; 
        },
        set(target, key, value) {
          target[key] = value; 
          moles[key].removeEventListener("click", clickHandler);
          
         //如果地鼠狀態為true
          if (value) {
            moles[key].addEventListener("click", clickHandler); //監聽是否點擊
            moles[key].classList.add("up"); //地鼠跳出
          } else {
            moles[key].classList.remove("up"); //地鼠埋入
          }
        },
      });
 const randomMoles = function () {
        const mole = Math.floor(Math.random() * moles.length); //取得地鼠的隨機號碼
        const time = Math.random() * 500 + 500; //設定時間在500~1000
        if (molesProxy[mole]) return randomMoles(); 
        //檢查地鼠是否是出現的狀態,如果是則randomMoles()
        
        molesProxy[mole] = true;
        
        //等待time / 2,如果遊戲時間還沒到,再隨機出現一隻地鼠
        setTimeout(() => {
          if (!timeUp) randomMoles();
        }, time / 2);
        //如果經過time時間沒有點擊到地鼠,地鼠會自動返回土裡
        setTimeout(() => {
          molesProxy[mole] = false;
        }, time);
      };
[ Alex 宅幹嘛 ] 👨💻 深入淺出 Javascript30 快速導覽 | Day 30:Whack A Mole
JS30